package com.example.lotterysystem.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import java.security.Key;
import java.util.Date;
import java.util.Map;

@Slf4j
public class JWTUtils {
    private static final String JWT_SECRET_KEY_STRING = "Snqhyg+gzcvCpmwNE8m46AumlYkolbLXO0/5FXT8eZc="; // 密钥内容
    private static final Key JWT_SECRET_KEY = Keys.hmacShaKeyFor(Decoders.BASE64.decode(JWT_SECRET_KEY_STRING)); // 用于加密的密钥
    private static final long JWT_EXPIRATION = 60 * 60 * 1000; // 超时时间 1h
    private static final String JWT_USER_ID = "userId";

    /**
     * 生成令牌
     * @param claim
     * @return
     */
    public static String genToken(Map<String, Object> claim) {
        if (null == claim) {
            return null;
        }
        try {
            String token = Jwts.builder()
                    .setClaims(claim) // 自定义信息
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis()+ JWT_EXPIRATION))
                    .signWith(JWT_SECRET_KEY)
                    .compact();
            return token;
        } catch (Exception e) {
            log.error("JWTUtils genToken 生成令牌失败", e);
            return null;
        }
    }

    /**
     * 解析令牌
     * @param token
     * @return
     */
    public static Claims parseToken(String token) {
        if (null == token) {
            return null;
        }
        try {
            JwtParser build = Jwts.parserBuilder().setSigningKey(JWT_SECRET_KEY).build();
            Claims claims = build.parseClaimsJws(token).getBody();
            return claims;
        } catch (Exception e) {
            log.error("JWTUtils parseToken 解析 token: {} 异常, ", token, e);
            return null;
        }
    }

    /**
     * 从令牌中获取用户 id
     * @param token
     * @return
     */
    public static Integer getIdByToken(String token) {
        Claims claims = parseToken(token);
        return claims == null ? null : (Integer) claims.get(JWT_USER_ID);
    }
}
